#!/bin/bash

# IO优化一键配置脚本
# 用于解决高IO负载导致系统死机问题

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 检查是否以root权限运行
if [ "$(id -u)" -ne 0 ]; then
   echo -e "${RED}此脚本需要root权限运行${NC}"
   echo "请使用 sudo $0 重新运行"
   exit 1
fi

echo -e "${BLUE}===== Linux系统IO高负载优化脚本 =====${NC}"
echo "此脚本将优化系统IO参数，缓解高负载时系统死机问题"
echo

# 显示当前配置
echo -e "${YELLOW}当前系统IO配置:${NC}"
echo "----------------------------------------"
echo "dirty_background_ratio: $(cat /proc/sys/vm/dirty_background_ratio)"
echo "dirty_ratio: $(cat /proc/sys/vm/dirty_ratio)"
echo "dirty_writeback_centisecs: $(cat /proc/sys/vm/dirty_writeback_centisecs)"
echo "dirty_expire_centisecs: $(cat /proc/sys/vm/dirty_expire_centisecs)"
echo "swappiness: $(cat /proc/sys/vm/swappiness)"
echo "vfs_cache_pressure: $(cat /proc/sys/vm/vfs_cache_pressure)"
echo "IO调度器: $(cat /sys/block/nvme0n1/queue/scheduler)"
echo "交换空间:"
free -h | grep -i swap
echo "----------------------------------------"

# 优化内核参数
echo -e "${BLUE}[1/4] 优化内核IO参数...${NC}"
cat > /etc/sysctl.d/99-io-optimization.conf << EOF
# IO优化参数 - 防止高负载假死
# 由io-optimizer脚本生成

# 脏页控制参数
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_writeback_centisecs = 100
vm.dirty_expire_centisecs = 300

# 内存管理参数
vm.swappiness = 30
vm.vfs_cache_pressure = 50
EOF

# 应用参数
sysctl -p /etc/sysctl.d/99-io-optimization.conf
echo -e "${GREEN}✓ 内核参数已优化${NC}"

# 检查并创建交换空间
echo -e "${BLUE}[2/4] 配置交换空间...${NC}"
if [ "$(swapon --show | wc -l)" -eq 0 ]; then
    echo "未检测到活动的交换空间，创建交换文件..."
    
    # 检查是否已存在交换文件
    if [ -f /swapfile ]; then
        echo "检测到已存在的交换文件，重新配置..."
        swapoff /swapfile 2>/dev/null
    else
        echo "创建8GB交换文件..."
        fallocate -l 8G /swapfile
        chmod 600 /swapfile
        mkswap /swapfile
    fi
    
    # 启用交换文件
    swapon /swapfile
    
    # 更新fstab
    if ! grep -q "^/swapfile" /etc/fstab; then
        echo "更新/etc/fstab..."
        # 删除旧的交换文件配置
        sed -i '/swapfile/d' /etc/fstab
        # 添加新的配置
        echo "/swapfile none swap sw 0 0" >> /etc/fstab
    fi
    
    echo -e "${GREEN}✓ 交换空间已配置${NC}"
else
    echo -e "${GREEN}✓ 交换空间已存在，无需配置${NC}"
fi

# 优化IO调度器
echo -e "${BLUE}[3/4] 优化IO调度器...${NC}"
cat > /etc/udev/rules.d/60-scheduler.rules << EOF
# 为NVMe设备设置IO调度器
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="mq-deadline"
EOF

# 立即应用调度器设置
for device in /sys/block/nvme*; do
    if [ -f "$device/queue/scheduler" ]; then
        echo "mq-deadline" > "$device/queue/scheduler"
    fi
done

echo -e "${GREEN}✓ IO调度器已优化${NC}"

# 优化文件系统挂载选项
echo -e "${BLUE}[4/4] 优化文件系统挂载选项...${NC}"

# 备份fstab
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d%H%M%S)

# 更新ext4分区的挂载选项
sed -i 's/\(ext4\s*\)\(rw.*\)/\1noatime,commit=60,barrier=0/' /etc/fstab

echo -e "${GREEN}✓ 文件系统挂载选项已优化${NC}"
echo -e "${YELLOW}注意: 挂载选项将在下次重启后生效${NC}"

# 总结
echo
echo -e "${GREEN}===== 系统IO优化完成 =====${NC}"
echo "已执行的优化:"
echo "1. 优化内核IO参数"
echo "2. 配置交换空间"
echo "3. 优化IO调度器"
echo "4. 优化文件系统挂载选项"
echo
echo -e "${YELLOW}建议重启系统以应用所有更改${NC}"
echo "如需恢复默认设置，请运行: sudo $(dirname "$0")/io-optimizer-restore.sh"